package lyx.game.element
{
	import flash.display.BitmapData;
	import flash.display.IBitmapDrawable;
	import flash.geom.Matrix;
	import flash.geom.Point;

	/**
	 * GameElement是游戏世界中的元素，具有渲染自己视图，以及一些游戏元素应该具有的行为。
	 * 此类暂未完善，最终目的使其支持多种view类的渲染，而不是单单的BitmapData。
	 */
	public class GameElement
	{
		//prepare for layer show in 45° game
		/**
		 * 表示该元素的可视化视图的层次深度，0为最低。当有一个GameElement的layer_level为1的时候，
		 * 该GameElement与为0的GameElement重叠时会遮挡住为0的GameElement。 
		 */		
		public var layer_level:int = 0;
		/**
		 * 元素生命值，-1表示无敌的，0表示死亡，大于0是其生命值。
		 */
		public var _life:int = 1;
		public function get life():Number
		{
			return _life;
		}
		public function set life(value:Number):void
		{
			_life = value;
		}
		public var x:Number;
		public var y:Number;
		
		/**
		 * GameElement的可视化数据 
		 */		
		public var view_data:BitmapData;
		
		/**
		 * 获取GameElement的碰撞数据，默认是返回view_data
		 * @return 
		 * 
		 */		
		public function get hit_area():BitmapData
		{
			return view_data;
		}
		
		protected var _view_updated:Boolean = true;
		
		public function GameElement()
		{
			
		}
		
		/**
		 * 将自己的可视化内容渲染到bitmap_data中去。
		 */
		public function render(bitmap_data:BitmapData):void
		{
			//渲染前会先更新视图数据
			if(_view_updated)
			{
				updateViewContext();
				_view_updated = false;
			}
			bitmap_data.copyPixels(view_data,view_data.rect,new Point(x,y));
		}
		
		/**
		 * 元素之间是否存在边界碰撞
		 */
		public function hitTest(element:GameElement):Boolean
		{
			var result:Boolean = false;
			if(this!=element && hit_area && element.hit_area)
			{
				var first_point:Point = new Point(x,y);
				var second_point:Point = new Point(element.x,element.y);
				result = hit_area.hitTest(first_point,0xFF,element.hit_area,second_point,0xFF);
			}
			return result;
		}
		
		/**
		 * 更新元素可视化内容，通过在子类中对该方法重写，来实现各种动画效果。
		 */
		protected function updateViewContext():void
		{
			
		}
	}
}